RubyKaigi 2022 Day 1 Towards Ruby 4 JIT
Towards Ruby 4 JIT - RubyKaigi 2022
k0kubun
Shopify
YJIT team
HAMLをv6でメッチャ速くした
What is Ruby JIT
Ruby -> AST -> Instruction Sequence (Bytecode) -> Machine Code
code:ruby
def three = 1 + 2
puts RubyVM::InstructionSequence.of(method(:three)).disasm
CRuby JIT
1: MJIT
2: YJIT
https://speed.yjit.org
https://speed.yjit.org/benchmarks/bench-2022-09-07-201219
MJITよりもYJITのほうが特定の場合で特に速い
MJIT
Ruby 2.6以降
Ruby 3.1
stable-ish, portable, native threads, written in C
Ruby 3.2
Experimental, fort + SIGCHLD, written in Ruby
standard library
YJIT
Ruby 3.1以降
--jit or --yjit
Ruby 3.1
x86_64 only, no code GC, written in C
Ruby 3.2
arm64 support, (hopefully) code GC, written in Rust
BYOJ (Bring Your Own JIT)
--mjit=pause
define RubyVM::MJIT.compile
c = RubyVM::MJIT.const_get(:c)
RubyVM::MJIT.resume to start JIT
RubyのJIT書いてないのはお前だけ
Benchmarking your JIT
https://github.com/shopify/yjit-bench
Future of YJIT
Ruby 4 fast as Java or Javascript
If fast, it's should be a reason to leave Python
Ruby 4 Canary
Array.min, max, include?などが爆速に
(1..100_000).eachも爆速に
Challenges
Constants
Rubyのコードを実行時に解析して最適化したRubyコードにしてやる
定数の冗長な参照を減らしてしまうことでメモリアクセスが減って高速になる
Variables
これもRubyのコードを実行時に解析して最適化したRubyコードにしてやる
グローバル変数にしてしまってメモリを予め確保しておいてるっぽい?yuiseki.icon
class var
instance var
Method calls
Code locality
Method inlining: C ↔ Ruby
etc
Garbage collection
メソッドの開始と終了でSTACK.addressでメモリを明示的に確保して明示的に解放する